// 联合类型 用管道符分隔 表示一种数据可以是多种类型 交集
function padLeft(str: string, padding: string | number): string | number {
  if (typeof padding === 'number') {
    return Array(padding + 1).join(' ') + str
  }
  if (typeof padding === 'string') {
    return padding + str
  }
  throw new Error('参数类型不正确！')
}

padLeft('你好', 1);

// 联合类型有共同的成员
// 鸟可以飞 可以下蛋
interface Bird {
  fly(): void
  layEggs(): void
}
// 鱼可以游泳，可以产卵
interface Fish {
  swim(): void
  layEggs(): void
}
// 将二者联合一下
let pet = ((): Fish | Bird => {
  return {
    layEggs() { },
    swim() { },
    fly() { }
  }
})()

// pet.fly(); 宠物没法飞
pet.layEggs();
// pet.swim(); 宠物也没法游泳

// 可以通过类型断言来绕开检测 手动强行让它飞和游泳
if ((<Fish>pet).swim) {
  (<Fish>pet).swim();
}

if ((<Bird>pet).fly) {
  (<Bird>pet).fly();
}